
const Koa = require('koa')
const Router=require('koa-router')
const bodyparser=require('koa-bodyparser')
const jwt = require('jsonwebtoken');
//连接后端数据库
const query=require('./db/index')
const help=require('./helper/helper')
const author=require('./middleware/author')
const timeFormat = require('./helper/timeFormat')

//搭建服务器
const app=new Koa();
//实例化路由
const router=new Router()
//中间件
app.use(bodyparser())
//token验证
app.use(author())

//测试接口
router.post('/test',async (ctx,next)=>{
    console.log(ctx.request.body)
    ctx.body='这是测试页面'
})

//注册接口
router.post('/register',async (ctx,next)=>{
    let {phone,pwd}=ctx.request.body;
    //验证手机号密码
    if(!/^1[3456789]\d{9}$/.test(phone)||!/^[0-9A-Za-z]{6,}$/.test(pwd)){
        return ctx.body={
            code:1,
            msg:'参数格式不正确'
        }
    }
    //验证手机号是否存在
    let result=await query('select * from sign where phone=?',[phone])
    if(result.length){
        return ctx.body={
            code:3,
            msg:'用户已存在'
        }
    }
    //注册 存入数据库
    let res=await query('insert into sign (phone,pwd) values (?,?)',[phone,help(pwd)])
    // console.log(res);
    //受影响的是一行代表插入成功
    if(res.affectedRows===1){
        ctx.body={
            code:0,
            msg:'注册成功'
        }
    }else{
        ctx.body={
            code:2,
            msg:'注册失败'
        }
    }
})

//登录接口
router.post('/login',async (ctx,next)=>{
    let {phone,pwd}=ctx.request.body;
    //验证手机号密码
    if(!/^1[3456789]\d{9}$/.test(phone)||!/^[0-9A-Za-z]{6,}$/.test(pwd)){
        return ctx.body={
            code:1,
            msg:'参数格式不正确'
        }
    }
    //登录用户
    let res= await query('select * from sign where phone=? and pwd=?',[phone,help(pwd)])
    //console.log(res);
    if(res.length){
        //如果登陆成功的话  
        //第一个是要加密的数据(一般是用户信息)
        //第二个是密钥 第三个是过期时间 //签发token
        let token=jwt.sign({...res[0]}, 'secret', { expiresIn: '1h' });
        ctx.body={
            code:0,
            msg:'登陆成功',
            token,
            //用户id
            uid:res[0].id
        }
    }else{
        ctx.body={
            code:2,
            msg:'用户名或密码错误'
        }
    }
})

//获取签到天数
router.get('/getsum',async (ctx,next)=>{
    //获取用户id
    let {id}=ctx.query;
    //容错处理
    if(!id){
        return ctx.body={
            code:1,
            msg:'参数错误'
        }
    }
    //去数据库中查询数据
    let res= await query('select * from sign where id=?',[id])
    ctx.body={
        sum:res[0].sum,
        code:0,
        msg:'获取成功'
    }
})

//点击签到接口
router.get('/sign',async (ctx,next)=>{
     //获取用户id
    let {id}=ctx.query;
    //容错处理
    if(!id){
        return ctx.body={
            code:1,
            msg:'参数错误'
        }
    }
    //去数据库中查询数据
    let [user]= await query('select * from sign where id=?',[id])
    let {sum=0,last_sign}=user;
    //获取当前时间
    let now=timeFormat(new Date())
    //上一次签到是今天
    if(last_sign===now){
        return ctx.body={
            code:1,
            msg:'今天已经签过到了'
        }
    }
    //否则---更新数据
    let res=await query('update sign set sum=?,last_sign=? where id=?',[sum*1+1,now,id])
    if(res.affectedRows===1){
        ctx.body={
            code:0,
            msg:'签到成功'
        }
    }else{
        ctx.body={
            code:2,
            msg:'签到失败'
        }
    }
})

//启动路由
app.use(router.routes())
app.use(router.allowedMethods())

//监听
app.listen(3000,()=>{
    console.log('running at 3000')
})